[Linear Algebra] 2.Linear Combination & Span

Linear Algebra
Author

신호연

Published

January 3, 2023

유투브 - 혁펜하임님의 선형대수학강의를 참고했습니다.

Linear Combination

벡터 \(\bf{v_1,v_2,\dots,v_n}\)의 선형결합(또는 일차결합)은 다음과 같다. \[w_1{\bf v_1} + w_2{\bf v_2} + \dots + w_n{\bf v_n}\] 선형결합의 결과는 여러가지 벡터들의 결합이다. 여기서 각각의 \(w_1,w_2,\dots,w_n\)은 스칼라이며 대응하는 \(x_1,x_2,\dots,x_n\)를 결합에 사용하는 정도를 의미한다. 만약 \(w_1 = 0.0001\)이면 여러 벡터들을 결합하지만 그 결합 중 \(\bf v_1\)이 아주 사용하여 결합하는 것이고 \(w_2 = 120\)이라면 결합에서 \(\bf v_2\)를 아주 많이 사용하는 것이다.

span

벡터 \(v_1,v_2,\dots,v_n\)의 선형결합에서 \(w_1,w_2,\dots,w_n\)(스칼라,결합에 사용하는 정도)를 바꿨을때 가능한 모든 벡터들의 집합이며 즉,벡터의 선형결합으로 가능한 모든 집합들이며 정의는 다음과 같다. \[\text{span}({\bf{v_1,v_2,\dots,v_n}}) := \{w_1{\bf{v_1}} + w_2{\bf{v_2}} + \dots + w_n{\bf{v_n}}:w_1,w_2,\dots,w_n \in K\}\]
span은 선형결합으로 만들어지는 또다른 벡터공간이다. 여기서 K는 field를 의미하는데 스칼라는 field라는 또다른 집합으로부터 가져온 원소이기때문에 그렇다.

임의의 벡터들의 span은 어떨까? 아래의 그림을 확인해보자.

<참고>
span은 동사로도 사용한다.
ex : 벡터공간을 생성한다. 열공간은 열벡터들이 생성하는 공간이다.(=열공간은 열벡터의 생성이다.).기저들이 벡터공간을 생성한다.

:는 조건을 의미합니다.

Code
import numpy as np
import matplotlib.pyplot as plt
import random
plt.style.use("ggplot")

def linrcmb(v1,v2):
    linrcomb_x= []
    linrcomb_y= []

    _w = np.linspace(-50,50,300).tolist()
    for i in range(2000):
    #w1,w2를 -100~100사이의 임의의 숫자로
        w1 = random.sample(_w,1)
        w2 = random.sample(_w,1)
        #print(w1,w2)
    #선형결합 계산
        linrcomb = w1 * v1 + w2 * v2
    #시각화를 위해 선형결합의 x값 y값 따로 모아놓기
        linrcomb_x.append(linrcomb[0][0])
        linrcomb_y.append(linrcomb[1][0])
    return linrcomb_x,linrcomb_y

v1 = np.array([[0],[0]])
v2 = np.array([[0],[0]])
x,y = linrcmb(v1,v2)
fig,ax = plt.subplots(figsize=(30,5))
plt.subplot(1,5,1)
plt.title("$v_1 = [0,0]^{T},v_2 = [0,0]^T$")
plt.scatter(x,y,color="black")

v1 = np.array([[1],[0]])
v2 = np.array([[-3],[0]])
x,y = linrcmb(v1,v2)
plt.subplot(1,5,2)
plt.title("$v_1 = [1,0]^{T},v_2 = [-3,0]^T$")
plt.scatter(x,y)

v1 = np.array([[1],[1]])
v2 = np.array([[0],[0]])
x,y = linrcmb(v1,v2)
plt.subplot(1,5,3)
plt.title("$v_1 = [1,0]^{T},v_2 = [0,0]^T$")
plt.scatter(x,y,color="green",alpha=1)


v1 = np.array([[1],[0]])
v2 = np.array([[0],[1]])
x,y = linrcmb(v1,v2)
plt.subplot(1,5,4)
plt.title("$v_1 = [1,0]^{T},v_2 = [0,1]^T$")
plt.scatter(x,y,color="purple",alpha=1)

def linrcmb2(v1,v2):
    linrcomb_x= []
    linrcomb_y= []

    _w = (np.linspace(-250,250,300)).tolist()
    for i in range(2000):
        w1 = random.sample(_w,1)[0] * 100 #그래프를 그리기 위한 값 조절
        w2 = random.sample(_w,1)[0] 
        #선형결합 계산
        linrcomb = w1 * v1 + w2 * v2
        #시각화를 위해 선형결합의 x값 y값 따로 모아놓기
        linrcomb_x.append(linrcomb[0][0])
        linrcomb_y.append(linrcomb[1][0])
    
    return linrcomb_x,linrcomb_y
linrcmb2(v1,v2)

v1 = np.array([[-1],[0]])
v2 = np.array([[2],[2]])
x,y = linrcmb2(v1,v2)
plt.subplot(1,5,5)
plt.title("$v_1 = [1,0]^{T},v_2 = [2,2]^T$")
plt.scatter(x,y,color="blue",alpha=1)
plt.subplots_adjust(wspace=0.4,hspace=0.5)
plt.suptitle("span$(v_1,v_2)$",y=1.02,fontsize=20)
Text(0.5, 1.02, 'span$(v_1,v_2)$')

점 하나는 벡터 하나를 나타낸다. 1번째 그림에서 벡터들의 생성(span)은 2차원 벡터공간의 부분공간이자 0차원 벡터공간(점)이며 2,3번째 그림에서 벡터들의 생성(span)은 2차원 벡터공간의 부분공간이자 1차원 벡터공간(직선)이다. 이와는 다르게 3번째 그림에서의 벡터들의 생성(span)은 3차원 벡터공간 그 자체인데 그 이유는 3차원 벡터공간의 모든 점을 표현할 수 있기 때문이다.

column Space

열공간(columns space)은 행렬의 열벡터들의 span 즉, 행렬의 열벡터들로 가능한 모든 선형조합(벡터)의 집합입니다. \(v_1,v_2,\dots,v_n\)이 행렬A의 열벡터들이라고 할 때, 열공간은 다음과 같습니다.
\[\text{C}(A) = \text{span}(v_1,v_2,\dots,v_n) = \{w_1{\bf v_1} + w_2{\bf v_2} + \dots + w_n{\bf v_n}:w_1,w_2,\dots,w_n \in K\}\] 열공간은 방정식 \(Ax = b\)의 해의 갯수를 파악하는데 쓰입니다.

참고자료

[선형대수] 벡터공간(vector space), 벡터 부분공간(vector subspace), 생성공간(span), 차원(dimension)
위키피디아-Linear span
위키피디아-Row and columns spaces
혁펜하임 - [선대] 2-6강. span 과 column space (열공간) 직관적 설명